package com.cms.server.resolver.plugins.sctz;

import java.sql.ResultSet;
import java.util.Date;

import com.efounder.builder.base.data.DataSetUtils;
import com.efounder.builder.base.data.EFDataSet;
import com.efounder.builder.base.data.EFRowSet;
import com.efounder.eai.data.JParamObject;
import com.efounder.form.EFFormDataModel;
import com.efounder.form.io.FormDataResolverAdapter;
import com.efounder.form.server.resolver.util.SYS_MDL_VAL;
import com.efounder.sql.JStatement;
import com.metadata.bizmodel.SYS_MODEL;
import com.persistence.FLOW_TASK_LIST;
/**
 * <p>Title: 会签节点提交，检查如果是最后一个会签部门提交流程，则提交到下一个节点，如果不是，则提交到的下个节点继续等待</p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2014</p>
 * @author prayer
 * @version 1.0
 */
public class CMSMergerCountersignNodeToNextNode extends FormDataResolverAdapter {

	//初始化FormDataModel
	public void finishSaveForm(JStatement stmt, EFFormDataModel model, JParamObject PO) throws Exception {
		EFDataSet                    billDataSet = model.getBillDataSet();
		EFDataSet                    flowDataSet = EFDataSet.getInstance();
		EFDataSet                    itemDataSet = EFDataSet.getInstance();
		EFRowSet                      itemRowSet = null;
		EFRowSet                  nextNodeRowset = EFRowSet.getInstance();
		EFRowSet                      flowRowset = EFRowSet.getInstance();
		String                            strSql = "";
		ResultSet                             rs = null;
		long                             curTime = new Date().getTime();
		String                            F_KJQJ = billDataSet.getRowSet(0).getString(PO.GetValueByParamName(SYS_MODEL._BLFL_KJQJ_COL_, SYS_MDL_VAL.BILL_KJQJ), "");
		String                            F_GUID = billDataSet.getRowSet(0).getString(PO.GetValueByParamName(SYS_MODEL._BILL_GUID_COL_, SYS_MDL_VAL.BILL_GUID), "");
		String                            F_DJBH = billDataSet.getRowSet(0).getString(PO.GetValueByParamName(SYS_MODEL._BILL_BH_COL_, SYS_MDL_VAL.BILL_BH), null);
		String                           FLOW_ID = PO.GetValueByParamName(FLOW_TASK_LIST._FLOW_ID, "");
		String                           NODE_ID = PO.GetValueByParamName(FLOW_TASK_LIST._OP_NODE, "");
		String                     RESR_IN_CAUSE = PO.GetValueByParamName(FLOW_TASK_LIST._RESR_IN_CAUSE, "");
		EFRowSet                      nodeRowset = EFRowSet.getInstance();
		String                   strHQDataSetKey = "";		//会签节点对应的单据分录数据集KEY
		java.util.List<String>    dataSetKeyList = new java.util.ArrayList<String>();//单据分录数据集KEY
		int                            itemCount = 0;
		java.util.List<String>        bmItemList = new java.util.ArrayList<String>();
		
		if(!RESR_IN_CAUSE.equals("submit")) return;
		
		//获取节点信息
		strSql = "select * from FLOW_NODE_LIST where FLOW_ID ='" + FLOW_ID + "' and NODE_ID = '" + NODE_ID + "'";
		rs = stmt.executeQuery(strSql);
		if(rs != null && rs.next()) nodeRowset = (EFRowSet) DataSetUtils.resultSet2RowSet(rs, nodeRowset);
		
		//获取节点的下一个节点信息，如果下个节点为会签节点，可能还有一种情况需要单独考虑：
		//会签节点可能分三个部门，会签节点下一个节点退回某个部门后，其他两个节点状态修改为等待状态
		//这个部门再退回到制单节点，制单节点把这个部门删了，那么提交到会签节点上一个节点（比如N2节点）后
		//这个节点（N2节点）提交后，因为其他两个节点处于等待状态，那么自动提交到会签节点的下一个节点，有点绕
		//获取节点信息
		strSql = "select * from FLOW_NODE_LIST where FLOW_ID ='" + FLOW_ID + "' and NODE_ID = '" + nodeRowset.getString("NODE_NEXT", "") + "'";
		rs = stmt.executeQuery(strSql);
		if(rs != null && rs.next()) nextNodeRowset = (EFRowSet) DataSetUtils.resultSet2RowSet(rs, nextNodeRowset);

		if(!(nodeRowset.getString("NODE_TYPE", "").equals("countersign") || nextNodeRowset.getString("NODE_TYPE", "").equals("countersign"))) return;
		
		//获取分录数据集的KEY
		if(billDataSet.getRowCount() > 0) {
			itemRowSet = billDataSet.getRowSet(0);
			dataSetKeyList = itemRowSet.getDataSetKeyList();
		}
		
		//如果是会签节点，则从节点的扩展属性里查找单据分录要取的数据集
		strSql = "select * from FLOW_NODE_ATTR where FLOW_ID ='" + FLOW_ID + "' and NODE_ID = '" + nodeRowset.getString("NODE_NEXT", "") + "' and ATTR_KEY = 'HQDataSetKey'";
		rs = stmt.executeQuery(strSql);
		//如果定义了要取的数据集KEY
		if(rs != null && rs.next()) {
			strHQDataSetKey = rs.getString("ATTR_VAL");
		} 
		//如果没有定义，则默认取第一个
		else {
			if(dataSetKeyList.size() > 0) strHQDataSetKey = dataSetKeyList.get(0);
		}
		//获取分录数据集
		itemDataSet = itemRowSet.getDataSet(strHQDataSetKey);
		
		//查看已经审批结束的会签节点
		strSql = " select * from FLOW_TASK_LIST where BIZ_DATE = '" + F_KJQJ + "' and BIZ_DJBH = '" + F_DJBH + "' and "
        	   + " FLOW_ID = '" + FLOW_ID + "' and RESR_STATUS = 'waiting' order by (OP_ID + 0) desc";
		rs = stmt.executeQuery(strSql);
		flowDataSet = DataSetUtils.resultSet2DataSet(rs, flowDataSet);
		
		for(int i = 0; i < itemDataSet.getRowCount(); i++) {
			if(!bmItemList.contains(itemDataSet.getRowSet(i).getString("F_BMBH", ""))) {
				bmItemList.add(itemDataSet.getRowSet(i).getString("F_BMBH", ""));
			}
		}
		//如果待审批的节点信息等于分录信息，则提交到下一个节点
		if(bmItemList.size() == flowDataSet.getRowCount()) {
			//获取操作时间最大的部门节点作为下一个节点的父节点
			itemRowSet = flowDataSet.getRowSet(0);
			//更新所有部门等待审批任务节点的状态
			for(int i = 0; i <flowDataSet.getRowCount(); i++) {
				strSql = "update FLOW_TASK_LIST set RESR_STATUS = 'processed', RESR_OUT_CAUSE = 'submit' where OP_ID = '" 
					   + flowDataSet.getRowSet(i).getString("OP_ID", "") + "' and FLOW_ID = '" + FLOW_ID + "'";
				stmt.execute(strSql);
				flowRowset = flowDataSet.getRowSet(i);
			}
			//如果是从会签节点上个节点自动提交到会签节点的下个节点,因为nextNodeRowset已经赋值，所以可以直接去下个节点
			if(!nodeRowset.getString("NODE_TYPE", "").equals("countersign")) {
				strSql = "select * from FLOW_NODE_LIST where FLOW_ID ='" + FLOW_ID + "' and NODE_ID = '" + nextNodeRowset.getString("NODE_NEXT", "") + "'";
			} 
			//如果是从会签节点提交到下个节点
			else {
				strSql = "select * from FLOW_NODE_LIST where FLOW_ID ='" + FLOW_ID + "' and NODE_ID = '" + nodeRowset.getString("NODE_NEXT", "") + "'";
			}
			rs = stmt.executeQuery(strSql);
			if(rs != null && rs.next()) {
				nextNodeRowset = (EFRowSet) DataSetUtils.resultSet2RowSet(rs, nextNodeRowset);
			}
			
		
			strSql = "insert into FLOW_TASK_LIST (OP_ID,FLOW_ID,BIZ_DJBH,BIZ_DATE,BIZ_GUID,OP_USER,OP_USER_NAME,OP_TIME,"
				   + "OP_BMBH,OP_NOTE,TASK_STATUS,OP_NODE,NODE_SRC,NODE_SRC_NAME,NODE_TAG,NODE_TAG_NAME,POP_ID,RESR_STATUS,TASK_TO_UNIT,TASK_TO_UNIT_NAME," ;
		 	
			for(int j = 1; j <= 20; j++) {
				if(j < 10) {
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + "0" + j, null) != null) {
						strSql += "F_CHAR0" + j + ",";
					}
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + "0" + j, null) != null) {
						strSql += "F_DATE0" + j + ",";
					}
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + "0" + j, null) != null) {
						strSql += "F_NUM0" + j + ",";
					}
				} else {
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + j, null) != null) {
						strSql += "F_CHAR" + j + ",";
					}
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + j, null) != null) {
						strSql += "F_DATE" + j + ",";
					}
					if(PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + j, null) != null) {
						strSql += "F_NUM" + j + ",";
					}
				}
			}
		 	strSql += "RESR_IN_CAUSE,RESR_OUT_CAUSE) values ('"
		 	        + curTime + "', '" + PO.GetValueByParamName(FLOW_TASK_LIST._FLOW_ID, "") + "', '"
					+ F_DJBH + "', '" + F_KJQJ + "', '" + F_GUID + "', '" + PO.GetValueByParamName(FLOW_TASK_LIST._OP_USER, "")
					+ "', '" + PO.GetValueByParamName(FLOW_TASK_LIST._OP_USER_NAME, "") + "', '"
					+ curTime + "', '" + PO.GetValueByParamName(FLOW_TASK_LIST._OP_BMBH, "") + "', '" 
					+ PO.GetValueByParamName(FLOW_TASK_LIST._OP_NOTE, "") + "', 'processing', '"
					+ PO.GetValueByParamName(FLOW_TASK_LIST._OP_NODE, "") + "', '" + nodeRowset.getString("NODE_ID", "") + "', '"
					+ nodeRowset.getString("NODE_NAME", "") + "', '" + nextNodeRowset.getString("NODE_ID", "") + "', '" + nextNodeRowset.getString("NODE_NAME", "") 
					+ "', '" + flowRowset.getString("OP_ID", "") + "', 'pending','','',";
		 	for(int j = 1; j <= 20; j++) {
		 		if(j < 10) {
		 			if(PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + "0" + j, null) != null) {
		 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + "0" + j, null)  + "',";
		 			} 
		 			if(PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + "0" + j, null) != null) {
		 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + "0" + j, null)  + "',";
		 			}
		 			if(PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + "0" + j, null) != null) {
		 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + "0" + j, null)  + "',";
		 			}
		 		} else {
		 			if(j == 19 && PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + j, null) != null) {
		 				strSql += "'',";
		 			} else if(j == 20 && PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + j, null) != null) {
		 				strSql += "'',";
		 			} else {
		 				if(PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + j, null) != null) {
			 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_CHAR + j, null)  + "',";
			 			}
		 			}
		 			if(PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + j, null) != null) {
		 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_DATE + j, null)  + "',";
		 			}
		 			if(PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + j, null) != null) {
		 				strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._F_NUM + j, null)  + "',";
		 			}
		 		}
		 	}
		 	strSql += "'" + PO.GetValueByParamName(FLOW_TASK_LIST._RESR_IN_CAUSE, "") + "', '')";
			stmt.execute(strSql);
			PO.SetValueByParamName(FLOW_TASK_LIST._OP_ID, String.valueOf(curTime));
		}
	}
}
